package com.lishem.leftgod.level1.class04;

import java.util.PriorityQueue;

/**
 * 输入：
 * 参数1，正数数组costs
 * 参数2，正数数组profits
 * 参数3，正数k
 * 参数4，正数m
 * costs[i]表示i号项目的花费
 * profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润)
 * k表示你不能并行、只能串行的最多做k个项目
 * m表示你初始的资金
 * 说明：你每做完一个项目，马上获得的收益，可以支持你去做下一个项目。
 * 输出：
 * 你最后获得的最大钱数。
 */
public class Code_03_IPO {

    public static class Node {
        public int p;
        public int c;

        public Node(int p, int c) {
            this.p = p;
            this.c = c;
        }
    }

    /**
     * @param k       表示你不能并行、只能串行的最多做k个项目
     * @param m       表示你初始的资金
     * @param profits 表示i号项目在扣除花费之后还能挣到的钱(利润)
     * @param capital 表示i号项目的花费
     * @return
     */
    public static int findMaxizedCapital(int k, int m, int[] profits, int[] capital) {
        PriorityQueue<Node> costQueue = new PriorityQueue<>((Node n1, Node n2) -> {
            return n1.c = n2.c;
        });
        for (int i = 0; i < profits.length; i++) {
            costQueue.add(new Node(profits[i], capital[i]));
        }

        PriorityQueue<Node> profitQueue = new PriorityQueue<>((Node n1, Node n2) -> {
            return n2.p - n1.p;
        });
        for (int i = 0; i < k; i++) {
            while (!costQueue.isEmpty() && costQueue.peek().c <= m) {
                profitQueue.add(costQueue.poll());
            }
            if (profitQueue.isEmpty()) {
                break;
            }
            m += profitQueue.peek().p;
        }
        return m;
    }

    public static void main(String[] args) {
        int[] capital = {1, 5, 6, 3, 8};
        int[] profits = {2, 7, 6, 2, 11};
        System.out.println(findMaxizedCapital(1, 9, profits, capital));
    }


}
